package shuaige.jdk.多线程.concurrent.completableFuture;

import lombok.SneakyThrows;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class 处理错误2 {

    @SneakyThrows
    public static void main(String[] args) {
        当此阶段完成时_将使用此阶段的结果和异常作为参数_同步进行调用();
    }

    public static void 当此阶段完成时_将使用此阶段的结果和异常作为参数_同步进行调用() throws ExecutionException, InterruptedException {
        CompletableFuture<String> completableFuture
                = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(2000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "Hello";
        });
        // 在此阶段完成时执行给定的操作。
        // 当此阶段完成时，将使用此阶段的结果（如果没有，则为null ）和异常（如果没有，则为null ）作为参数调用给定的操作。
        // 当动作返回时，返回的阶段就完成了
        CompletableFuture<String> stringCompletableFuture = completableFuture
                .thenApply(s -> {
                    return s;
                })
                .whenComplete((s, throwable) -> {
                    System.out.println("s:" + s);
                    System.out.println("throwable:" + throwable);
                });
        // 无返回值
        String s = stringCompletableFuture.get();
        System.out.println(s);
    }

    public static void 当此阶段完成时_将使用此阶段的结果和异常作为参数_异步进行调用() throws ExecutionException, InterruptedException {
        CompletableFuture<String> completableFuture
                = CompletableFuture.supplyAsync(() -> {
            return "Hello";
        });
        // 在此阶段完成时执行给定的操作。
        // 当此阶段完成时，将使用此阶段的结果（如果没有，则为null ）和异常（如果没有，则为null ）作为参数调用给定的操作。
        // 当动作返回时，返回的阶段就完成了
        CompletableFuture<String> stringCompletableFuture = completableFuture
                .thenApply(s -> {
                    return s;
                })
                .whenCompleteAsync((s, throwable) -> {
                    try {
                        Thread.sleep(2000L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("s:" + s);
                    System.out.println("throwable:" + throwable);
                });
        // 无返回值
        String s = stringCompletableFuture.get();
        String s1 = completableFuture.get();
        System.out.println(s1);
        System.out.println(s);
    }
}
